Dart eval:Program 类
介绍
一个 Program 类实例就是一个编译后的 EVC 字节码,可以直接由 dart_eval 的 Runtime 执行。
成员
topLevelDeclarations
程序顶层声明的全局字节码偏移量:
Map<int, Map<String, int>> topLevelDeclarations;
instanceDeclarations
程序的实例级声明的全局字节码偏移量:
/// Example instance declaration:
/// 1: { // file
/// "SomeClass": [
/// { "someProp": 221 }, // getters
/// { "someProp": 254 }, // setters
/// { "someMethod": 288 }, // methods
/// ]
/// }
Map<int, Map<String, List>> instanceDeclarations;
给了一个例子说明什么是实例级声明,但是还是每太看懂,是说 getter、setter、methods 都是实例级声明?还是说当他们返回常量时才是实例级声明?
typeNames
程序中使用的类型名称的有序列表,其索引与类型ID相对应。
List<String> typeNames;
字面理解,把程序中的类型收集起来了,成为一个列表。
typeTypes
程序中使用的类型超类型集(type supertype sets)的有序列表,其索引与类型ID相对应。
List<Set<int>> typeTypes;
什么叫使用的类型超类型集(type supertype sets)的有序列表。
bridgeLibraryMappings
从库URI到内部库ID的映射:
Map<String, int> bridgeLibraryMappings;
与桥接相关的,尽管 Key、Value 还不确定怎么回事。
bridgeFunctionMappings
从桥梁函数名称到内部 InvokeExternal ID 的映射。:
Map<int, Map<String, int>> bridgeFunctionMappings;
同上,dart_eval 支持两种桥接方式,一种是以库为粒度导出,一种是以函数粒度导出。
常量池
这俩比较容易理解,程序的常量池:
List<Object> constantPool;
List<RuntimeTypeSet> runtimeTypes;
globalInitializers
全局变量的初始化器的字节码偏移量:
List<int> globalInitializers;
enumMappings
从枚举到全局的映射:
Map<int, Map<String, Map<String, int>>> enumMappings;
字节码序列
List<EvcOp> ops;